home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Online / weazel / source / weazel.c
C/C++ Source or Header  |  1998-03-30  |  3KB  |  179 lines

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. #include <netdb.h>
  8.  
  9. void uzmislovo (int soq, char *slovo) {
  10.  
  11.     if (recv (soq, slovo, 1, 0)!=1) {
  12.         perror("recv");
  13.         exit(1);
  14.     }
  15.  
  16. }
  17.  
  18. void pop_poruka (int soq, char *slovo) {
  19.  
  20.         do {
  21.         uzmislovo (soq,slovo);
  22.                 putchar(*slovo);
  23.         } while (!(*slovo=='\r'));
  24.  
  25.         uzmislovo (soq,slovo);
  26.  
  27.     if (!(*slovo=='\n')) {
  28.         exit(1);
  29.     }
  30.  
  31.     printf ("\n");
  32. }
  33.  
  34.  
  35. int check (int soq) {
  36.  
  37.     char *slovo = '\0';
  38.     char buf[4];
  39.  
  40.     uzmislovo (soq, slovo);
  41.  
  42.     if (*slovo=='+') {
  43.         if ((recv (soq, buf, 2, 0)==2) && (buf[0]=='O'&&buf[1]=='K')) {
  44.              printf("+OK");
  45.                         /* stvar je ok - ispisujemo poruku i kraj f-je */
  46.             pop_poruka (soq,slovo);
  47.             return(0);
  48.         }
  49.         else {
  50.                     /* nekaj ne stima. vjerojatno nije POP server */
  51.             printf("POP3 server not responding.\n");
  52.                     exit(1);
  53.         }
  54.     }
  55.  
  56.     else if (*slovo=='-') {
  57.         if ((recv (soq, buf, 3, 0)==3) && ((buf[0]=='E') && (buf[1]=='R') && (buf[2]='R'))) {
  58.             printf("+ERR");
  59.             /* greska - ispisujemo poruku i kraj programa */
  60.             pop_poruka (soq,slovo);
  61.             exit(1);
  62.         }
  63.         else {
  64.                     /* nekaj ne stima. vjerojatno nije POP server */
  65.             printf("POP3 server not responding.\n");
  66.                     exit(1);
  67.         }
  68.     }
  69.  
  70.     /* nekaj ne stima. vjerojatno nije POP server */
  71.     printf("POP3 server not responding.\n");
  72.     exit(1);
  73. }
  74.  
  75. void main (int argc, char *argv[]) {
  76.  
  77.     int soq;
  78.     int count;
  79.     struct hostent *host;
  80.     struct sockaddr_in sin = { 0 };
  81.     FILE *fp;
  82.     FILE *env;
  83.     char buf[512];
  84.     char hostname[512];
  85.     char user_cmd[38] = "USER \0";
  86.     char user[32];
  87.     char pass_cmd[38] = "PASS \0";
  88.     char pass[32];
  89.  
  90.     if (argc!=2) {
  91.         printf ("Usage: weazel <message_file>\n");
  92.         exit(1);
  93.     }
  94.  
  95.     if (!(fp=fopen(argv[1],"rb"))) {
  96.         printf ("Error opening file %s.\n",argv[1]);
  97.         exit(1);
  98.     }
  99.  
  100.     if (!(env=fopen("ENV:WEAZEL","rb"))) {
  101.         printf ("Config file not found.\n");
  102.         exit(1);
  103.     }
  104.  
  105.     fgets(user,32,env);
  106.     fgets(pass,32,env);
  107.         fgets(hostname,512,env);
  108.  
  109.     /* sad maknemo CR i LF sa kraja houstnejma ako ih ima */
  110.  
  111.     if (hostname[strlen(hostname)-1]=='\r'||hostname[strlen(hostname)-1]=='\n') {
  112.                 hostname[strlen(hostname)-1]='\0';
  113.     }
  114.  
  115.     if (hostname[strlen(hostname)-1]=='\r'||hostname[strlen(hostname)-1]=='\n') {
  116.                 hostname[strlen(hostname)-1]='\0';
  117.     }
  118.  
  119.     fclose(env);
  120.  
  121.     soq = socket (AF_INET,SOCK_STREAM,0);
  122.  
  123.     if (soq < 0) {
  124.         perror ("socket");
  125.                 exit (1);
  126.     }
  127.  
  128.     if (!(host=gethostbyname(hostname))) {
  129.         perror ("gethostbyname");
  130.         exit (1);
  131.     }
  132.  
  133.     memcpy (&sin.sin_addr, host->h_addr, sizeof(sin.sin_addr));
  134.     sin.sin_family = host->h_addrtype;
  135.     sin.sin_port = 110;            /* POP3 port */
  136.  
  137.     if(connect(soq, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)) < 0)
  138.     {
  139.         perror("connect");
  140.         exit(1);
  141.     }
  142.  
  143.     printf("Connected to %s.\n",hostname);
  144.  
  145.     check(soq);
  146.  
  147.     strcat(user_cmd,user);
  148.  
  149.     send(soq,user_cmd,strlen(user_cmd),0);
  150.  
  151.     check(soq);
  152.  
  153.     strcat(pass_cmd,pass);
  154.  
  155.     send (soq,pass_cmd,strlen(pass_cmd),0);
  156.  
  157.         check(soq);
  158.  
  159.     send (soq,"XTND XMIT\r\n",11,0);
  160.  
  161.         check(soq);
  162.  
  163.     do {
  164.             count = fread(buf, 1, 512, fp);
  165.         send (soq,buf,count,0);
  166.     } while (!(feof(fp)));
  167.  
  168.     send (soq,"\r\n.\r\n",5,0);
  169.  
  170.     check(soq);
  171.  
  172.     send (soq,"QUIT\r\n",6,0);
  173.  
  174.     check(soq);
  175.  
  176.     CloseSocket(soq);
  177.  
  178. }
  179.